package ar.unsam.tp.programa

import ar.unsam.tp.excepciones.EquipoLlenoException
import ar.unsam.tp.excepciones.JugadorAnotadoException
import ar.unsam.tp.excepciones.JugadorNoJuegaException
import java.util.ArrayList
import java.util.List
import ar.unsam.tp.infraccion.Ausente

class Equipo {
	public List<Jugador> formacionInicial = new ArrayList<Jugador>
	public List<Jugador> formacionFinal = new ArrayList<Jugador>
	var List<Jugador> lista

	new(List<Jugador> listaDejugadoresSeguros) {
		lista = listaDejugadoresSeguros
	}

	def void confirmaEquipo(Jugador jugador) {
		var List<Jugador> aux = new ArrayList<Jugador>
		aux.addAll(formacionInicial)
		aux.toSet
		formacionFinal.toSet

		try 
		{
			this.controlaJugadorSeguro(jugador, aux)
			this.controlaRepetido(jugador, this.formacionFinal)
			this.equipoLleno(this.formacionFinal)
			this.formacionFinal.add(jugador)
			aux.remove(jugador)
			
		} catch (JugadorNoJuegaException jnje) 
		{
			throw new JugadorNoJuegaException("")
		} catch (JugadorAnotadoException jae) 
		{
			throw new JugadorAnotadoException("")
		} catch (EquipoLlenoException ele) 
		{
			throw new EquipoLlenoException("")
		} finally 
		{
			comparaFormaciones
		}
	}

	def boolean comparaFormaciones() 
	{
		this.formacionFinal.toSet
		this.formacionInicial.toSet
		formacionInicial.equals(formacionFinal)
	}

	def void controlAsistencia() 
	{
		formacionInicial.forEach[jugador|verificaAsistencia(jugador)]
	}

	def boolean verificaAsistencia(Jugador jugador) 
	{
		if (!formacionFinal.contains(jugador)) 
		{
			jugador.setInfraccion(new Ausente)
			jugador.penaliza
			true
		} else
			false
	}

	def void alta(Jugador jugador) 
	{
		try 
		{
			
			this.controlaJugadorSeguro(jugador, this.lista)
			this.controlaRepetido(jugador, this.formacionInicial)
			this.equipoLleno(this.formacionInicial)
			this.formacionInicial.add(jugador)
			this.lista.remove(jugador)
			
		} catch (JugadorNoJuegaException jnje) 
		{
			mostrarErrorEnConsola(jnje.message)
		} catch (JugadorAnotadoException jae) 
		{
			mostrarErrorEnConsola(jae.message)
		} catch (EquipoLlenoException ele) 
		{
			mostrarErrorEnConsola(ele.message)
		}
	}

	def void controlaJugadorSeguro(Jugador jugador, List<Jugador> form) 
	{
		if (!form.contains(jugador)) 
		{
			throw new JugadorNoJuegaException("El jugador no se encuentra en la lista de jugadores de este partido")
		}
	}

	def void controlaRepetido(Jugador jugador, List<Jugador> form) 
	{
		if (form.contains(jugador)) 
		{
			throw new JugadorAnotadoException("El jugador ya se encuentra anotado")
		}
	}

	def void equipoLleno(List<Jugador> form) throws EquipoLlenoException{
		if (form.size >= 5) 
		{
			throw new EquipoLlenoException("Equipo lleno")
		}
	}

	def void mostrarErrorEnConsola(String mensaje) 
	{
		println(mensaje)
	}
}
